package com.example.demo.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * @param key 键值
     * @return 0L时表示
     */
    public Long getExpireTime(String key){
        if (hasKey(key)){
            return redisTemplate.getExpire(key, TimeUnit.SECONDS);
        }else {
            return 0L;
        }
    }

    /**
     *
     * @param key  存在里面的key
     * @param time 设置失效时间
     * @return true or false
     */
    public boolean setExpireTime(String key, Long time){
        try {
            if (time > 0 && hasKey(key).toString().equals("true") ){
                redisTemplate.expire(key,time, TimeUnit.SECONDS);
                LoggerConfig.getLoggerInfo("加入redis成功");
                return true;
            }else {
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     *  检查Redis中是否存在key
     * @param key 传入key
     * @return true or false
     */
    public Boolean hasKey(String key){
        try {
            return redisTemplate.hasKey(key);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     *
     * @param key 键
     * @param value 值
     * @param time 过期时间
     * @return TRUE OR FALSE
     */
    public boolean setKeyWithTime(String key , Object value,long time){
        try {
            if (hasKey(key).toString().equals("true")){
                return false;
            }else {
                if (time > 0){
                    // 存在key时删除key重新添加
                    if (hasKey(key)){
                        String[] str  = new String[10];
                        str[0] = key;
                        delete(str);
                    }
                    redisTemplate.opsForValue().set(key,value,time,TimeUnit.SECONDS);
                    return true;
                }else {
                    return false;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }


    /**
     *
     * @param key 键值
     * @param value  值
     * @return 成功或者失败
     */
    public boolean setKey(String key,Object value){
        try {
            if (hasKey(key).toString().equals("true")){
                return false;
            }else {
                    redisTemplate.opsForValue().set(key,value);
                    return true;
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * @param key 传入键
     * @return 返回null,表示未查询到相关key的值
     */
    public Object get(String key){
        if (hasKey(key).toString().equals("true")){
            return redisTemplate.opsForValue().get(key);
        }else {
            return null;
        }
    }

    /**
     * @param key 数组
     * 遇到问题，无法删除设置的缓存，原因是因为已经设置了自己的序列化方式，但是删除的时候调用的时默认的序列化方式
     */
    @SuppressWarnings("unchecked")
    public void delete(String[] key){
        if (key != null && key.length > 0){
            if (key.length == 1){
                redisTemplate.delete(key[0]);
                LoggerConfig.getLoggerInfo("删除单个键值成功");
            }else {
                redisTemplate.delete(CollectionUtils.arrayToList(key));
                LoggerConfig.getLoggerInfo("删除多个键值成功");
            }
        }
    }
}
